package com.checknull.druineage.element;

import com.alibaba.druid.util.StringUtils;
import com.checknull.druineage.customizable.UsedForCal;

import java.util.ArrayList;
import java.util.List;

public class DB {

    private List<Schema> schemas = new ArrayList<>();

    public List<Schema> getSchemas() {
        return schemas;
    }

    /**
     * 合并并返回schema
     *
     * @param schema
     * @return 正确的schema
     * @description 将传入的schema与现有的schema集合进行比较，若已存在相同的，则使用现有的schema
     * 若不存在，则添加进schema集合，整理完之后再返回正确的schema
     */
    public Schema absorbSchema(Schema schema) {
        for (Schema scm : schemas) {
            if (StringUtils.isEmpty(schema.getName())) {
                if (StringUtils.isEmpty(scm.getName())) {
                    return scm;
                }
            } else if (schema.getName().equalsIgnoreCase(scm.getName())) {
                return scm.absorb(schema);
            }
        }
        schemas.add(schema);
        schema.setOwner(this);
        return schema;
    }

    /**
     * 清除所有schema中所有表的所有常量字段
     */
    public void clearValColumn() {
        for (Schema schema : schemas) {
            schema.clearValColumn();
        }
    }

    /**
     * 清理临时表
     *
     * @param usedForCal 血缘作用计算器
     */
    public void clearTempTable(UsedForCal usedForCal) {
        for (Schema schema : schemas) {
            schema.clearTempTable(usedForCal);
        }
        schemas.removeIf(schema -> schema.getTables().isEmpty());
    }

    /**
     * 清理删除表
     *
     * @param usedForCal 血缘作用计算器
     */
    public void clearDropTable(UsedForCal usedForCal) {
        for (Schema schema : schemas) {
            schema.clearDropTable(usedForCal);
        }
        schemas.removeIf(schema -> schema.getTables().isEmpty());
    }

    /**
     * 清理中间表
     *
     * @param usedForCal 血缘作用计算器
     */
    public void clearMidTable(UsedForCal usedForCal) {
        for (Schema schema : schemas) {
            schema.clearMidTable(usedForCal);
        }
        schemas.removeIf(schema -> schema.getTables().isEmpty());
    }

}
